package com.core.cloudbusiness.system.demo.controller;

import com.core.cloudcommon.CommonResult;
import com.core.cloudcommon.trace.TraceLogger;
import com.core.cloudcommon.trace.Traceable;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * @author =====Lqj=====
 * @className LogTestController
 * @description 日志测试控制器，用于验证链路ID绑定效果
 * @create 2024/12/17 10:30
 **/
@Slf4j
@RestController
@RequestMapping("/api/demo/log")
public class LogTestController {

    /**
     * 测试各种级别的日志是否都包含链路ID
     */
    @GetMapping("/test-levels")
    @Traceable(operation = "测试日志级别", description = "测试各种级别的日志是否都包含链路ID")
    public CommonResult<Map<String, Object>> testLogLevels() {
        Map<String, Object> result = new HashMap<>();
        
        // 使用原生log记录各种级别的日志
        log.debug("这是一条DEBUG级别的日志，应该包含链路ID");
        log.info("这是一条INFO级别的日志，应该包含链路ID");
        log.warn("这是一条WARN级别的日志，应该包含链路ID");
        log.error("这是一条ERROR级别的日志，应该包含链路ID");
        
        // 使用TraceLogger记录日志
        TraceLogger.debug("TraceLogger - DEBUG日志测试");
        TraceLogger.info("TraceLogger - INFO日志测试");
        TraceLogger.warn("TraceLogger - WARN日志测试");
        TraceLogger.error("TraceLogger - ERROR日志测试");
        
        // 使用TraceLogger记录业务日志
        TraceLogger.business("日志测试", "测试各种级别的日志", "测试成功");
        TraceLogger.businessStart("日志测试", "开始测试", null);
        TraceLogger.businessEnd("日志测试", "结束测试", "成功", 100L);
        
        result.put("message", "日志级别测试完成，请查看控制台和日志文件");
        result.put("logLevels", new String[]{"DEBUG", "INFO", "WARN", "ERROR"});
        result.put("testTime", System.currentTimeMillis());
        
        return CommonResult.OK(result);
    }

    /**
     * 测试业务操作日志
     */
    @PostMapping("/test-business")
    @Traceable(operation = "测试业务日志", description = "测试业务操作相关的日志记录")
    public CommonResult<Map<String, Object>> testBusinessLogs(@RequestBody Map<String, Object> params) {
        Map<String, Object> result = new HashMap<>();
        
        // 模拟业务操作流程
        TraceLogger.businessStart("用户注册", "开始用户注册流程", params);
        
        // 模拟参数验证
        log.info("开始参数验证");
        TraceLogger.info("参数验证通过");
        
        // 模拟数据库操作
        TraceLogger.database("INSERT", "sys_user", "用户信息", "插入成功");
        
        // 模拟缓存操作
        TraceLogger.cache("SET", "user:123", "用户缓存", "设置成功");
        
        // 模拟外部接口调用
        TraceLogger.externalCall("短信服务", "sendSms", "13800138000", "发送成功", 200L);
        
        // 模拟性能监控
        TraceLogger.performance("用户注册", 500L, params);
        
        // 模拟安全事件
        TraceLogger.security("用户注册", "新用户注册成功", "INFO");
        
        TraceLogger.businessEnd("用户注册", "用户注册流程完成", "注册成功", 500L);
        
        result.put("message", "业务日志测试完成");
        result.put("operation", "用户注册");
        result.put("status", "成功");
        
        return CommonResult.OK(result);
    }

    /**
     * 测试异常情况下的日志
     */
    @GetMapping("/test-exception")
    @Traceable(operation = "测试异常日志", description = "测试异常情况下的日志记录")
    public CommonResult<Map<String, Object>> testExceptionLogs() {
        Map<String, Object> result = new HashMap<>();
        
        try {
            log.info("开始执行可能出现异常的操作");
            
            // 模拟异常
            int division = 10 / 0;
            
        } catch (Exception e) {
            log.error("捕获到异常", e);
            TraceLogger.error("业务异常: {}", e.getMessage(), e);
            
            result.put("error", "捕获到异常: " + e.getMessage());
        }
        
        log.info("异常处理完成");
        result.put("message", "异常日志测试完成");
        
        return CommonResult.OK(result);
    }

    /**
     * 测试多线程环境下的链路ID传递
     */
    @GetMapping("/test-thread")
    @Traceable(operation = "测试多线程", description = "测试多线程环境下的链路ID传递")
    public CommonResult<Map<String, Object>> testThreadLogs() {
        Map<String, Object> result = new HashMap<>();
        
        log.info("主线程开始执行");
        
        // 在新线程中测试链路ID
        Thread thread = new Thread(() -> {
            log.info("子线程开始执行");
            TraceLogger.info("子线程中的TraceLogger日志");
            log.info("子线程执行完成");
        });
        
        thread.start();
        
        try {
            thread.join(); // 等待子线程完成
        } catch (InterruptedException e) {
            log.error("线程等待被中断", e);
        }
        
        log.info("主线程执行完成");
        
        result.put("message", "多线程日志测试完成");
        result.put("note", "注意观察子线程的日志是否包含链路ID");
        
        return CommonResult.OK(result);
    }

    /**
     * 测试大量日志输出的性能
     */
    @GetMapping("/test-performance")
    @Traceable(operation = "测试日志性能", description = "测试大量日志输出的性能")
    public CommonResult<Map<String, Object>> testLogPerformance() {
        Map<String, Object> result = new HashMap<>();
        
        long startTime = System.currentTimeMillis();
        
        // 输出大量日志
        for (int i = 0; i < 1000; i++) {
            if (i % 100 == 0) {
                log.info("批量日志测试 - 进度: {}/1000", i);
            }
            log.debug("调试日志 - 序号: {}", i);
        }
        
        long endTime = System.currentTimeMillis();
        long duration = endTime - startTime;
        
        log.info("大量日志输出完成，耗时: {}ms", duration);
        
        result.put("message", "日志性能测试完成");
        result.put("logCount", 1000);
        result.put("duration", duration);
        result.put("avgTime", duration / 1000.0);
        
        return CommonResult.OK(result);
    }

    /**
     * 获取当前的MDC信息
     */
    @GetMapping("/mdc-info")
    public CommonResult<Map<String, Object>> getMDCInfo() {
        Map<String, Object> result = new HashMap<>();
        
        // 这里可以添加获取MDC信息的逻辑
        log.info("获取MDC信息请求");
        
        result.put("message", "MDC信息获取完成，请查看日志");
        result.put("timestamp", System.currentTimeMillis());
        
        return CommonResult.OK(result);
    }
}
